package gui.logado.mensagens;

import conexao.Http;
import conexao.HttpData;
import conexao.HttpListener;
import gui.logado.mensagens.enviar.Enviar;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Vector;
import javax.microedition.lcdui.*;
import net.sourceforge.floggy.persistence.*;
import recados.Recados;

public class CaixaSaida extends List implements CommandListener {

    private final Command cmdVoltar;
    private final Command cmdParar;
    private final Command cmdReenviar;
    private final Command cmdVer;
    private final Command cmdExcluir;
    //TODO Comando tentar
    //
    private final Vector sendObjects;
    private final Vector https;
    //
    private Image imageEnviando;
    private Image imageFalha;
    private Image imageParado;
    private Image imageConcluido;
    //

    public CaixaSaida() {
        super("Caixa Saida", List.IMPLICIT);

        https = new Vector(1);
        sendObjects = new Vector(1);

        try {
            imageEnviando = Image.createImage("/gui/logado/mensagens/enviando.png");
            imageFalha = Image.createImage("/gui/logado/mensagens/falhou.png");
            imageParado = Image.createImage("/gui/logado/mensagens/parado.png");
            imageConcluido = Image.createImage("/gui/logado/mensagens/concluido.png");
        } catch (IOException ex) {
        }

        //Comandos
        cmdVoltar = new Command("Voltar", Command.BACK, 0);
        cmdVer = new Command("Ver", Command.ITEM, 0);
        cmdParar = new Command("Parar", Command.ITEM, 1);
        cmdReenviar = new Command("Reenviar", Command.ITEM, 2);
        cmdExcluir = new Command("Excluir", Command.ITEM, 3);

        addCommand(cmdVoltar);
        setCommandListener(this);

        //TODO Carega Memoria prieira instancia
    }

    public void reloadOfMemory() {
        try {
            sendObjects.removeAllElements();
            https.removeAllElements();
            deleteAll();

            PersistableManager pm = PersistableManager.getInstance();

            Filter desteUsuario = new Filter() {

                public boolean matches(Persistable prstbl) {
                    SendObject sendObject = (SendObject) prstbl;
                    System.out.print(sendObject);
                    String de = sendObject.getDe();
                    String currentUser = Recados.getInstance().getLoginConfig().getNome();
                    System.out.print(currentUser + " = " + de);
                    return de.equals(currentUser);
                }
            };

            ObjectSet keepSends = pm.find(SendObject.class, desteUsuario, null);

            if (keepSends.size() < 1) {
                return;
            }

            System.out.println("Envios encontrados: " + keepSends.size());

            for (int i = 0; i < keepSends.size(); i++) {
                SendObject tempS = (SendObject) keepSends.get(i);
                add(tempS, false);
            }

        } catch (FloggyException ex) {
            Recados.setCurrent(new Alert("Erro", "Problema ao carregar caixa de saida", null, AlertType.ERROR));
        }

        updateSreeen();
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmdVoltar) {
            Recados.setCurrent(Recados.getInstance().getMensagens());
            return;
        }

        if (c == cmdVer) {
            if (getSelectedIndex() > -1) {
                Http http = (Http) https.elementAt(getSelectedIndex());
                Form estadoEnvio = new Form(http.getHttpData().get("para"));
                estadoEnvio.addCommand(new Command("Voltar", Command.BACK, EXCLUSIVE));
                Recados.setCurrent(estadoEnvio);
                //TODO Melhorar
                //TODO Exibir formulario
                //por a mensagem do progresso etc
            }
        } else if (c == cmdParar) {
            if (getSelectedIndex() > -1) {
                Http http = (Http) https.elementAt(getSelectedIndex());
                http.cancela();
            }
        } else if (c == cmdReenviar) {
            if (getSelectedIndex() > -1) {
                SendObject tempS = (SendObject) sendObjects.elementAt(getSelectedIndex());

                Enviar enviar = Recados.getInstance().getEnviar();
                enviar.setBack(this);

                enviar.getPara().setString(tempS.getPara());
                enviar.getMensagem().setString(tempS.getMensagem());

                if (tempS.getEnderecoArquivo() != null && tempS.getEnderecoArquivo().length() > 0) {
                    enviar.getArquivo().setString(tempS.getEnderecoArquivo());
                    enviar.setAnexo(true);
                }

                Recados.setCurrent(enviar);
            }
        } else if (c == cmdExcluir) {
            if (getSelectedIndex() > -1) {

                https.removeElementAt(getSelectedIndex());
                SendObject tempS = (SendObject) sendObjects.elementAt(getSelectedIndex());

                try {
                    PersistableManager.getInstance().delete(tempS);
                } catch (FloggyException ex) {
                    ex.printStackTrace();
                }

                sendObjects.removeElement(tempS);
                updateSreeen();
            }
        }
    }

    public void updateSreeen() {

        deleteAll();

        for (int i = 0; i < https.size(); i++) {
            Http http = (Http) https.elementAt(i);
            String para = http.getHttpData().get("para");

            switch (http.getEstado()) {
                case Http.WORKING:
                    append(para, imageEnviando);
                    break;
                case Http.DONE:
                    https.removeElementAt(i);
                    try {
                        PersistableManager.getInstance().delete((SendObject) sendObjects.elementAt(i));
                    } catch (FloggyException ex) {
                        ex.printStackTrace();
                        //TODO alertar
                    }
                    sendObjects.removeElementAt(i);
                    break;
                case Http.STOPPED:
                    append(para, imageParado);
                    break;
                case Http.FAILED:
                    append(para, imageFalha);
                    break;
                default:
                    append(para, imageParado);
                    break;
            }
        }

        if (size() > 0) {
            addCommand(cmdExcluir);
            addCommand(cmdParar);
            addCommand(cmdVer);
            addCommand(cmdReenviar);
        }
    }

    public void add(SendObject tempS, boolean send) {

        try {
            tempS.salva();
        } catch (FloggyException ex) {
            Recados.setCurrent(new Alert("Erro", "Problema ao salvar na caixa de saida", null, AlertType.ERROR));
        }

        HttpData data = new HttpData();
        data.setPagina("/envia_recado.php");

        data.put("de", Recados.getInstance().getLoginConfig().getNome());
        data.put("para", tempS.getPara());
        data.put("mensagem", tempS.getMensagem());
        data.put("tipo", "recado");

        if (tempS.getEnderecoArquivo() != null && tempS.getEnderecoArquivo().length() > 0) {
            data.put("tipo", "arquivo");

            String url = tempS.getEnderecoArquivo();
            String nome = url.substring(url.lastIndexOf('/', url.length() - 2));

            data.setArquivo("arquivo", nome, "aplication/octet-stream", url);
        }

        Http http = new Http(data.get("para"));
        http.setHttpData(data);

        HttpListener messageListener = new HttpListener() {

            public void requisicaoConcluida(DataInputStream in) {
                String primeiraLinha = Http.readLine(in);
                String segundaLinha = Http.readLine(in);

                if (primeiraLinha.equals("erro")) {
                    Recados.setCurrent(new Alert("Concluido", segundaLinha, null, AlertType.ERROR));
                } else if (primeiraLinha.equals("ok")) {
                    Enviar enviar = Recados.getInstance().getEnviar();
                    enviar.getMensagem().setString("");
                    enviar.getArquivo().setString(null);
                    enviar.setAnexo(false);

                    System.out.println("Mensagem enviada");

                    updateSreeen();
                }
            }

            public void requisicaoCancelada() {
                Recados.setCurrent(Recados.getInstance().getCaixaSaida());
            }

            public void falhaRequisiçao(String mensagem) {
                Recados.setCurrent(new Alert("Concluido", "Falha ao enviar mensagem", null, AlertType.ERROR));
            }
        };

        http.setListener(messageListener);

        https.addElement(http);
        sendObjects.addElement(tempS);

        if (send) {
            http.doPost(true);
        }

        updateSreeen();
    }
}
